home *** CD-ROM | disk | FTP | other *** search
/ Flash MX Savvy / FlashMX Savvy.iso / pc / WIN / UltraDev / UltraDev_Trial.exe / Disk1 / data1.cab / Configuration_En / Commands / MasterDetail.js < prev    next >
Encoding:
JavaScript  |  2000-12-11  |  28.2 KB  |  932 lines

  1. // Copyright 2000 Macromedia, Inc. All rights reserved.
  2.  
  3. //*************** GLOBALS  *****************
  4.  
  5. var m_Recordset = "";
  6. var m_ColumnsToShow = "";
  7. var m_AvailableColumns = "";
  8. var m_NumberOfRecords = 0;
  9. var m_CreateFile = false;
  10. var m_FileName = ""
  11. var m_LinkFromColumn = ""
  12. var m_UniqueKeyColumn = ""
  13. var m_urlPath;
  14. var m_RepeatRegionName = "";
  15.  
  16. var LIST_RS, LIST_COL_SHOW, LIST_KEY_COL, LIST_LINK_COL, LIST_DETAIL_COL;
  17. //var CHECK_CREATEFILE;
  18. var m_ColShowArray, m_ColAvlArray, m_DetailColShowArray, mDetailColAvlArray, m_typesArray, m_allColumnsArray; 
  19.  
  20. var MODEL_IS_CF;
  21. var NUM_RepeatCount = 0; // this number is updated in initializeUI
  22. var TF_REPEAT_COUNT;
  23. var helpDoc = MM.HELP_objMasterDetail;
  24.  
  25. //******************* API **********************
  26.  
  27. function commandButtons()
  28. {
  29.    return new Array( BTN_OK, "okClicked()",
  30.                      BTN_Cancel, "cancelClicked()",
  31.                      BTN_Help, "displayHelp()");
  32. }
  33.  
  34. //***************** LOCAL FUNCTIONS  ******************
  35.  
  36.  
  37. function windowDimensions(platform)
  38. {
  39.   if(navigator.platform.charAt(0)=="M")
  40.   {
  41.     return "400,480";
  42.   } else {
  43.     return "";
  44.   }
  45. }
  46.  
  47. function initializeUI() {
  48.  
  49.   var errMsg ="";
  50.  
  51.   //Build Recordset menu
  52.   LIST_RS           = new ListControl("Recordset");
  53.   LIST_COL_SHOW     = findObject("ColumnsToShow");
  54.   LIST_DETAIL_COL   = findObject("DetailColumnsToShow");
  55.   
  56.   //The two objects below will be used for all m anipulation of data.
  57.   LIST_LINK_COL   = new ListControl("LinkColumn");
  58.   LIST_KEY_COL    = new ListControl("KeyColumn");
  59.  
  60.   //These two objects are a copy of the two above but will be used only for 
  61.   //the enabling/disabling mechanism. All data related manipulation must be 
  62.   //done using the above two objects.
  63.   LIST_LINK_COL_OBJ = findObject("LinkColumn");
  64.   LIST_KEY_COL_OBJ  = findObject("KeyColumn");
  65.   
  66.   TF_REPEAT_COUNT   = findObject("RepeatCount");
  67.   RB_COUNT          = new RadioGroup("RecordCount");
  68.  
  69.   EDIT_FILENAME     = findObject("DetailFileName");
  70.  
  71.   m_ColShowArray = new Array();
  72.   m_ColAvlArray = new Array();
  73.   m_DetailColShowArray = new Array();
  74.   m_DetailColAvlArray = new Array();
  75.   m_allColumnsArray = new Array();
  76.   m_typesArray = new Array();
  77.   
  78.   MODEL_IS_CF = (dw.getDocumentDOM() != null && dw.getDocumentDOM().serverModel.getServerName() == "Cold Fusion");
  79.  
  80.   NUM_RepeatCount = TF_REPEAT_COUNT.value;
  81.   m_RepeatRegionName = createNewRepeatRegionName();
  82.  
  83.   var rsNames = findRecordsetServerBehaviorNames();
  84.  
  85.   //Fill the Recordset listbox with names of the Recordset objects available
  86.   //on the current page. 
  87.   LIST_RS.setAll(rsNames,rsNames);
  88.  
  89.   //Get the currently selected Recordset
  90.   m_Recordset = LIST_RS.get();
  91.  
  92.   findTheRecordsetColumns(m_Recordset);
  93.   updateColumnLists();
  94.   updateDetailColumnList();
  95.   updateColumnLinkList();
  96.  
  97.   //Populate the Unique Key Column List.
  98.   LIST_KEY_COL.setAll(m_ColShowArray, m_ColShowArray);
  99.  
  100.   // store current repeat count as global var
  101.   NUM_RepeatCount = TF_REPEAT_COUNT.value;
  102.  
  103. }
  104.  
  105. //This method is called when the recordset has changed and the 
  106. //columns need to be gotten from the Recordset. This method will update
  107. //the arrays that support the list boxes.
  108. function findTheRecordsetColumns(recordset)
  109. {
  110.   //Init vars
  111.   var newLength = 0;
  112.   var colTypesOk = true;
  113.  
  114.   var ssRecordset = findRecordset(recordset);
  115.     
  116.   //Empty m_ColShowArray first...
  117.   newLength = m_ColShowArray.length;
  118.   m_ColShowArray.splice(0, newLength);
  119.  
  120.     //Empty m_allColumnsArray
  121.   var allColumnsLength = m_allColumnsArray.length;
  122.   m_allColumnsArray.splice(0, allColumnsLength);
  123.  
  124.     // Empty m_typesArray
  125.   var typesLength = m_typesArray.length;
  126.   m_typesArray.splice(0, typesLength);
  127.  
  128.   //Empty m_ColAvlArray too...
  129.   var showAvlLength = m_ColAvlArray.length;
  130.   m_ColAvlArray.splice(0, showAvlLength);
  131.  
  132.   //Empty m_DetailAvlArray
  133.   var detailArrayLength = m_DetailColAvlArray.length;
  134.   m_DetailColAvlArray.splice(0, showAvlLength);
  135.  
  136.   //Empty m_DetailColShowArray first...
  137.   newLength = m_DetailColShowArray.length;
  138.   m_DetailColShowArray.splice(0, newLength);
  139.  
  140.   //Get all the column names for the Recordset
  141.   //and put them in the Show array.
  142.   
  143.   m_ColShowArray = findAllColumnNames(m_Recordset);
  144.     
  145.   //Since the columns will include the 3 Recordset stats objects, 
  146.   //remove them from the list before updating the dialog list boxes.
  147.   newLength = (m_ColShowArray.length) - 3;
  148.   m_ColShowArray.splice(newLength, 3);
  149.  
  150.   //Get all the column names for the Recordset
  151.   //and put them in the Detail Show array.
  152.   m_DetailColShowArray = findAllColumnNames(m_Recordset);
  153.  
  154.   //Since the columns will include the 3 Recordset stats objects, 
  155.   //remove them from the list before updating the dialog list boxes.
  156.   newLength = (m_DetailColShowArray.length) - 3;
  157.   m_DetailColShowArray.splice(newLength, 3);
  158.  
  159.     var bRefresh = new Boolean();
  160.   bRefresh = false;
  161.   MMDB.refreshCache(bRefresh);
  162.   var colsAndTypes = getCachedColumnAndTypeArray(ssRecordset.rsName);
  163.   
  164.   if (String(colsAndTypes[0]).indexOf("MM_ERROR:") == -1)
  165.   {
  166.     var numCols = 0
  167.     for (var i = 0; i < colsAndTypes.length; i+=2)
  168.     {
  169.       m_allColumnsArray[numCols] = colsAndTypes[i]
  170.       m_typesArray[numCols] = colsAndTypes[i + 1]
  171.     
  172.     if(m_typesArray[numCols] == "")
  173.     {
  174.     if(colTypesOk)
  175.        colTypesOk = false;
  176.     }
  177.       numCols++
  178.     }
  179.   } else {
  180.     //Don't do anything here. If something is not right with the 
  181.     //recordset, we would have caught it earlier.
  182.   }
  183.   
  184.   //If the column types did not make it, we have another chance to get the info
  185.   //if the server model is Cold Fusion.
  186.   if(!colTypesOk)
  187.   {
  188.     //If the server model is Cold Fusion, let's try something else as well...
  189.     if(MODEL_IS_CF) {
  190.     var rsObj = ParseSimpleSQL(ssRecordset.source);
  191.     
  192.     if(rsObj) {
  193.       var numColsCF = 0
  194.         var colsAndTypesCF = MMDB.getColumnAndTypeOfTable(ssRecordset.connectionName, rsObj.table);
  195.  
  196.     for (var i = 1; i < colsAndTypesCF.length; i+=2)
  197.     {
  198.         m_typesArray[numColsCF] = colsAndTypesCF[i];
  199.       numColsCF++;
  200.     }
  201.     }
  202.   }
  203.   }
  204. }
  205.  
  206. function updateColumnLists()
  207. {
  208.  
  209.   var showArr = new Array();
  210.  
  211.   for (j=0; j < m_ColShowArray.length; j++) {
  212.      showArr.push("<option>" + escHTMLChars(m_ColShowArray[j]) + "</option>");
  213.   }
  214.   LIST_COL_SHOW.innerHTML = showArr.join("");
  215. }
  216.  
  217. function updateDetailColumnList()
  218. {
  219.  
  220.   var showArr = new Array();
  221.   for (var j=0; j < m_DetailColShowArray.length; j++) {
  222.      showArr.push("<option>" + escHTMLChars(m_DetailColShowArray[j]) + "</option>");
  223.   }
  224.   LIST_DETAIL_COL.innerHTML = showArr.join("");
  225.  
  226. }
  227.  
  228. function updateColumnLinkList()
  229. {
  230.   LIST_LINK_COL.setAll(m_ColShowArray, m_ColShowArray);
  231. }
  232.  
  233.  
  234. function escHTMLChars(theStr) {
  235.   theStr = String(theStr);
  236.   theStr = theStr.replace(/\&/g,"&");
  237.   theStr = theStr.replace(/\</g,"<");
  238.   theStr = theStr.replace(/\>/g,">");
  239.   return theStr;
  240. }
  241.  
  242. function okClicked() {
  243.   
  244.   var retval = getDataFromUI();
  245.   //findRecordset();
  246.   if (retval == "") {
  247.      if (applyMasterDetail())
  248.        window.close();
  249.   } else {
  250.   alert(retval);
  251.   }
  252. }
  253.  
  254. function cancelClicked()
  255. {
  256.   MM.commandReturnValue = "false"
  257.   window.close();
  258. }
  259.  
  260.  
  261. function RecordsetChanged()
  262. {
  263.   m_Recordset = LIST_RS.get();
  264.   findTheRecordsetColumns(m_Recordset);
  265.   updateColumnLists();
  266.   updateDetailColumnList();
  267.   updateColumnLinkList();
  268.  
  269.   //Populate the Unique Key Column List.
  270.   LIST_KEY_COL.setAll(m_ColShowArray, m_ColShowArray);
  271. }
  272.  
  273.  
  274. function applyMasterDetail() {
  275.  
  276.  
  277.   var temp_width;
  278.   var repeatRegionPart1, repeatRegionPart2, repeatRegionPart3, repeatRegionPart4;
  279.  
  280.   MM.setBusyCursor();
  281.  
  282.   MODEL_IS_CF = (dw.getDocumentDOM() != null && dw.getDocumentDOM().serverModel.getServerName() == "Cold Fusion");
  283.  
  284.   //BEGIN: Code for the detail page
  285.  
  286.   var colIndex = -1;
  287.   var index = 0; 
  288.  
  289.   for (index=0; index < m_allColumnsArray.length; index++) 
  290.   {
  291.     if(m_UniqueKeyColumn == m_allColumnsArray[index])
  292.       colIndex = index; 
  293.   }
  294.  
  295.   var detailPageObj = new Object();
  296.   detailPageObj.columnList = m_DetailColShowArray;
  297.   detailPageObj.colId = m_UniqueKeyColumn;
  298.   
  299.   if(colIndex > -1) {
  300.     detailPageObj.columnType = m_typesArray[colIndex];
  301.   } else {
  302.     detailPageObj.columnType = "";
  303.   }
  304.  
  305.   detailPageObj.paramName = "MM_ColParam";
  306.   detailPageObj.detailPageName = buildUpFileName(EDIT_FILENAME.value);
  307.  
  308.   detailPageObj.ssRec = findRecordset(m_Recordset);
  309.  
  310.   MM.commandReturnValue = detailPageObj;
  311.  
  312.   var DEBUG = false;
  313.   if (DEBUG) var debugMsg="COMPOUND SB OBJECT TEST:\n";
  314.  
  315.   //fixUpSelection(dreamweaver.getDocumentDOM());
  316.  
  317.   var paramObj = new Object();
  318.   var sbObj = null;
  319.  
  320.   //create new, empty custom group
  321.   var customGroup = new Group();
  322.  
  323.   //Open the Go To Detail Page Group
  324.   var goToDetailPageGroup = new Group("goToDetailPage");
  325.  
  326.   //Open the 4 existing Move To group files we are borrowing from
  327.   var moveToFirstGroup = new Group("moveToFirstRecord");
  328.   var moveToPrevGroup = new Group("moveToPreviousRecord");
  329.   var moveToNextGroup = new Group("moveToNextRecord");
  330.   var moveToLastGroup = new Group("moveToLastRecord");
  331.  
  332.   //Open the rsStat group file we are borrowing from
  333.   var rsStatsGroup = new Group("Recordset Statistics");
  334.  
  335.   //For ColdFusion, the are two repeat region groups... one for all records and the 
  336.   //other for a fixed number of records.
  337.  
  338.   if(MODEL_IS_CF & m_NumberOfRecords == -1)
  339.   {
  340.     repeatRegionPart1 = new Participant("repeatedRegionAll_init");
  341.     repeatRegionPart3 = new Participant("repeatedRegionAll_begin");
  342.  
  343.   } else {
  344.  
  345.     //get the RepeatedRegion participants.
  346.     repeatRegionPart1 = new Participant("repeatedRegion_init2");
  347.     repeatRegionPart2 = new Participant("repeatedRegion_beginInit");
  348.     repeatRegionPart3 = new Participant("repeatedRegion_begin");
  349.     repeatRegionPart4 = new Participant("repeatedRegion_end2");
  350.   }
  351.   
  352.   //paramObj.loopName = m_Recordset + "RR";
  353.   paramObj.loopName = m_RepeatRegionName;
  354.   paramObj.rsName = m_Recordset;
  355.   
  356.   paramObj.numRows = m_NumberOfRecords;
  357.  
  358.   customGroup.addParticipants(Array(repeatRegionPart1));
  359.  
  360.   if(MODEL_IS_CF & m_NumberOfRecords == -1) 
  361.   {
  362.   //don't do anything.
  363.   }
  364.   else {
  365.     customGroup.addParticipants(Array(repeatRegionPart2));
  366.   }
  367.  
  368.   //get the "aboveHTML" participants from the Go To Detail Page group
  369.   customGroup.addParticipants(goToDetailPageGroup.getParticipants("aboveHTML"));
  370.  
  371.   //get "directive" participants from Move To groups and add to customGroup
  372.   customGroup.addParticipants(moveToFirstGroup.getParticipants("aboveHTML"));
  373.   customGroup.addParticipants(moveToPrevGroup.getParticipants("aboveHTML"));
  374.   customGroup.addParticipants(moveToNextGroup.getParticipants("aboveHTML"));
  375.   customGroup.addParticipants(moveToLastGroup.getParticipants("aboveHTML"));
  376.  
  377.   //get "directive" participants from stat group and add to customGroup
  378.   customGroup.addParticipants(rsStatsGroup.getParticipants("aboveHTML"));
  379.  
  380.   var customStatPart = new Participant("rsStats_display");
  381.  
  382.   var rowDataPart = new Participant("MasterDetail_TableData");
  383.  
  384.   var rowPart = new Participant("MasterDetail_TableRow");
  385.  
  386.   var tablePart = new Participant("MasterDetail_Table");
  387.  
  388.   var dynDataPart = new Participant("dynamicData_ref");
  389.  
  390.   if (DEBUG) debugMsg += "\nAdded all directive participants from Move To, a total of "+customGroup.participants.length;
  391.   
  392.   //BEGIN The stuff for the table and repeat region go here....
  393.   
  394.   var tableStr = "";
  395.   var tableStr2 = "";
  396.  
  397.   var tableObj = new Object();
  398.   var tableObj2 = new Object();
  399.   var dynObj = new Object();
  400.   var rrObj = new Object();
  401.  
  402.   //dynObj.rs = m_Recordset;
  403.   //dynObj.col = m_ColShowArray[i];
  404.  
  405.   tableObj.align = "default";
  406.   
  407.   var tableWidth = String(100/m_ColShowArray.length);
  408.   var decimalIndex = tableWidth.indexOf(".");
  409.   if ( decimalIndex > -1) {
  410.     tableObj.width = tableWidth.slice(0, decimalIndex);
  411.   } else {
  412.     tableObj.width = tableWidth;
  413.   }
  414.  
  415.   for (var i = 0; i < m_ColShowArray.length; i++) {
  416.  
  417.   tableObj.rowDataContent = m_ColShowArray[i];
  418.     tableStr += rowDataPart.getInsertString(tableObj, "afterSelection")
  419.   }
  420.  
  421.   tableObj.preRowData = "";
  422.   tableObj.tableRowContent = tableStr;
  423.   tableObj.postRowData = "";
  424.  
  425.   tableStr = rowPart.getInsertString(tableObj, "afterSelection");
  426.  
  427.  
  428.   for (var i = 0; i < m_ColShowArray.length; i++) {
  429.   
  430.   if (m_LinkFromColumn == m_ColShowArray[i]) {
  431.       var linkObj = new Object();
  432.     var hrefObj = new Object();
  433.     var goToDetailPart = new Participant("goToDetailPage_attr");
  434.  
  435.     var hrefPart = new Participant("Href");
  436.  
  437.     linkObj.rs = m_Recordset;
  438.     //linkObj.col = m_ColShowArray[i];
  439.     linkObj.col = m_UniqueKeyColumn;
  440.     linkObj.url = m_FileName;
  441.     linkObj.keepType = "Both";
  442.     
  443.     linkObj.paramName = m_UniqueKeyColumn;
  444.  
  445.     dynObj.rsName = m_Recordset;
  446.     dynObj.bindingName = m_ColShowArray[i];
  447.     
  448.     hrefObj.hrefParam = goToDetailPart.getInsertString(linkObj, "nodeAttribute");
  449.     
  450.     if (dw.getDocumentDOM() != null && dw.getDocumentDOM().serverModel.getServerName() == "JSP" &&
  451.         m_LinkFromColumn == m_UniqueKeyColumn) {
  452.       //Need to handle duplicate getObject calls for JSP 1.0
  453.       var dynDataJSP = new Participant("dynamicData_refJSP");
  454.       hrefObj.linkParam = dynDataJSP.getInsertString(dynObj, "replaceSelection");
  455.     } else {
  456.       hrefObj.linkParam = dynDataPart.getInsertString(dynObj, "replaceSelection");  
  457.     }
  458.     
  459.     tableObj.rowDataContent = hrefPart.getInsertString(hrefObj, "replaceSelection");
  460.     if(MODEL_IS_CF)
  461.       tableObj.rowDataContent = tableObj.rowDataContent.replace(/<[\/]?cfoutput>/gi, "");
  462.   } else {
  463.     dynObj.rsName = m_Recordset;
  464.     dynObj.bindingName = m_ColShowArray[i];
  465.     tableObj.rowDataContent = dynDataPart.getInsertString(dynObj, "replaceSelection");
  466.     if(MODEL_IS_CF)
  467.       tableObj.rowDataContent = tableObj.rowDataContent.replace(/<[\/]?cfoutput>/gi, "");
  468.   }
  469.     tableStr2 += rowDataPart.getInsertString(tableObj, "afterSelection")
  470.   }
  471.  
  472.   rrObj.loopName = m_RepeatRegionName;
  473.   rrObj.rsName = m_Recordset;
  474.  
  475.   tableObj2.preRowData = repeatRegionPart3.getInsertString(rrObj, "beforeSelection");
  476.  
  477.   if (MODEL_IS_CF & m_NumberOfRecords == -1)
  478.     tableObj2.postRowData = "";
  479.   else 
  480.     tableObj2.postRowData = repeatRegionPart4.getInsertString(rrObj, "afterSelection");
  481.  
  482.   if(MODEL_IS_CF)
  483.   {
  484.   tableObj2.postRowData += "</cfoutput>";
  485.   }
  486.   tableObj2.tableRowContent = tableStr2;
  487.  
  488.   tableStr2 = rowPart.getInsertString(tableObj2, "afterSelection");
  489.  
  490.   paramObj.tableContent = tableStr + tableStr2;
  491.   paramObj.tableAlign = "center";
  492.   paramObj.border = "1";
  493.   customGroup.addParticipants(Array(tablePart))
  494.  
  495.   // END The stuff for the table and repeat region go here....
  496.  
  497.   //We will be using tables, so
  498.   customPart = new Participant("rsNav_Table");
  499.   customGroup.addParticipants(Array(customPart));   
  500.   
  501.   //Add the Recordset Stats participant
  502.   customGroup.addParticipants(Array(customStatPart));   
  503.  
  504.   //Hide Links
  505.   //Get the groups handling the Show Regions for first and last record.
  506.   var showRegion_firstRecord = new Group("showRegion_notFirstRecord");
  507.   var showRegion_lastRecord = new Group("showRegion_notLastRecord");
  508.  
  509.   //get the show Region participants.
  510.   
  511.   var showRegion_first_participants = showRegion_firstRecord.getParticipants()
  512.   var showRegion_last_participants = showRegion_lastRecord.getParticipants();
  513.   
  514.   var emptyParamObject = new Object();
  515.  
  516.   //Set the showRegion parameters
  517.   paramObj.hideLinksFirstBegin = showRegion_first_participants[0].getInsertString(emptyParamObject, "beforeSelection");
  518.   paramObj.hideLinksFirstEnd = showRegion_first_participants[1].getInsertString(emptyParamObject, "afterSelection");
  519.   if(MODEL_IS_CF) {
  520.     paramObj.hideLinksFirstEnd += "</cfif>";
  521.   }
  522.   paramObj.hideLinksLastBegin = showRegion_last_participants[0].getInsertString(emptyParamObject, "beforeSelection");
  523.   paramObj.hideLinksLastEnd = showRegion_last_participants[1].getInsertString(emptyParamObject, "afterSelection");
  524.   if(MODEL_IS_CF) {
  525.     paramObj.hideLinksLastEnd += "</cfif>";
  526.   }
  527.  
  528.   //set parameter values for Move To stuff (from UI settings)
  529.   paramObj.rsName  = m_Recordset;
  530.   paramObj.rs      = m_Recordset;
  531.   paramObj.col     = "";
  532.   paramObj.paramName = "";
  533.  
  534.   var displayStats_participant = rsStatsGroup.getParticipants("replaceSelection");
  535.  
  536.   paramObj.bindingName = "first";
  537.   var firstDisplayStr = displayStats_participant[0].getInsertString(paramObj, "replaceSelection");
  538.   if(firstDisplayStr && firstDisplayStr.length)paramObj.firstStatistics = firstDisplayStr;
  539.     
  540.   paramObj.bindingName = "last";
  541.   var lastDisplayStr = displayStats_participant[0].getInsertString(paramObj, "replaceSelection");
  542.   if( lastDisplayStr && lastDisplayStr.length) paramObj.lastStatistics = lastDisplayStr;
  543.  
  544.   paramObj.bindingName = "total";
  545.   var totalDisplayStr = displayStats_participant[0].getInsertString(paramObj, "replaceSelection");
  546.   if(totalDisplayStr && totalDisplayStr.length) paramObj.totalStatistics = totalDisplayStr;
  547.  
  548.   //set parameter values for compound object from localizeable globals file.
  549.   paramObj.firstStr = MM.LABEL_NewMoveToFirstLinkLabel;  //"First" in English
  550.   paramObj.prevStr  = MM.LABEL_NewMoveToPrevLinkLabel;
  551.   paramObj.nextStr  = MM.LABEL_NewMoveToNextLinkLabel;
  552.   paramObj.lastStr  = MM.LABEL_NewMoveToLastLinkLabel;
  553.  
  554.  
  555.   //set parameter values extracted from Move To groups, in this case HREF strings
  556.   var hrefArray = moveToFirstGroup.getInsertStrings(paramObj,"nodeAttribute+HREF");
  557.   if (hrefArray && hrefArray.length) paramObj.moveFirstHref = hrefArray[0];
  558.   var hrefArray = moveToPrevGroup.getInsertStrings(paramObj,"nodeAttribute+HREF");
  559.   if (hrefArray && hrefArray.length) paramObj.movePrevHref = hrefArray[0];
  560.   var hrefArray = moveToNextGroup.getInsertStrings(paramObj,"nodeAttribute+HREF");
  561.   if (hrefArray && hrefArray.length) paramObj.moveNextHref = hrefArray[0];
  562.   var hrefArray = moveToLastGroup.getInsertStrings(paramObj,"nodeAttribute+HREF");
  563.   if (hrefArray && hrefArray.length) paramObj.moveLastHref = hrefArray[0];
  564.  
  565.   //Code for the Recordset Statistics
  566.   //Open the rsStats group files we are borrowing from
  567.   var rsStatsGroup = new Group("rsStats");
  568.   customGroup.addParticipants(rsStatsGroup.getParticipants(""));
  569.  
  570.   //Set the individual parameters for the rsStats group
  571.   paramObj.beforeFirst = MM.LABEL_RSNavBeforeFirst;
  572.   paramObj.beforeLast  = MM.LABEL_RSNavBeforeLast;
  573.   paramObj.beforeTotal = MM.LABEL_RSNavBeforeTotal;
  574.   paramObj.afterTotal  = MM.LABEL_RSNavAfterTotal;  
  575.  
  576.   setMoveToParamsForJsp(paramObj);
  577.  
  578.   //Apply everything to the page
  579.   
  580.   fixUpInsertionPoint();
  581.  
  582.   customGroup.apply(paramObj,sbObj);
  583.   MM.clearBusyCursor();
  584.  
  585.   return true;
  586. }
  587.  
  588. function findRecordset(recordsetName)
  589. {
  590.    var ssRecords = dw.sbi.getServerBehaviors();
  591.    var ssRec = new SSRecord();
  592.    
  593.    for (var i = 0; i < ssRecords.length; i++)
  594.    {  
  595.      if(ssRecords[i].type == "recordset")
  596.    {  
  597.       if(ssRecords[i].rsName == m_Recordset)
  598.     {
  599.       ssRec = ssRecords[i]
  600.       copyServerBehavior(ssRec)
  601.     } 
  602.    }
  603.    }
  604.  
  605.    return ssRec;
  606. }
  607.  
  608. function getDataFromUI()
  609. {
  610.   var retval = "";
  611.  
  612.   m_Recordset = LIST_RS.getValue();
  613.  
  614.   if(m_Recordset != "") {
  615.   }
  616.   else {
  617.     retval = MM.MSG_invalidRS;
  618.   }
  619.   
  620.   if (RB_COUNT.getSelectedIndex()== 0)
  621.   {
  622.      var rc =TF_REPEAT_COUNT.value;
  623.      if (!((parseInt(rc)== rc) && (rc>0)))
  624.      {
  625.       return MM.MSG_ValueGreaterThanZero;
  626.      } else {
  627.     m_NumberOfRecords = parseInt(rc);
  628.    } 
  629.   } else {
  630.   m_NumberOfRecords = -1;
  631.   }
  632.  
  633.   if(m_ColShowArray.length == 0)
  634.   retval = MM.MSG_columnsEmpty;
  635.  
  636.   m_CreateFile = true;
  637.   m_FileName = EDIT_FILENAME.value;
  638.   if ((!m_FileName) || (m_FileName.charAt(0) == " ") || (m_FileName.charAt(0) == " ") || (m_FileName.length == 0) ||
  639.     (m_FileName.indexOf("/") != -1) || (StripChars(" ", m_FileName) == ""))
  640.     retval = errMsg(MM.MSG_invalidDetailPageName, m_FileName); 
  641.  
  642.   if(LIST_LINK_COL.getLen() && LIST_LINK_COL_OBJ.selectedIndex >= 0)
  643.     m_LinkFromColumn = LIST_LINK_COL_OBJ.options[LIST_LINK_COL_OBJ.selectedIndex].text;
  644.   else 
  645.   retal = MM.MSG_invalidLinkFromColumn;
  646.     
  647.   if(LIST_KEY_COL.getLen() && LIST_KEY_COL_OBJ.selectedIndex >= 0)
  648.     m_UniqueKeyColumn = LIST_KEY_COL_OBJ.options[LIST_KEY_COL_OBJ.selectedIndex].text;
  649.   else
  650.     retval = MM.MSG_invalidUniqueKeyColumn;
  651.  
  652.   return retval;
  653. }
  654.  
  655.  
  656. //The "Move Up" button has been clicked
  657. function onMoveUpClicked()
  658. {
  659.   var index = LIST_COL_SHOW.selectedIndex
  660.   if(index > 0)
  661.   {
  662.     //Swap the text in the list control
  663.   var columnValue = LIST_COL_SHOW.options[index].text;
  664.   LIST_COL_SHOW.options[index].text = LIST_COL_SHOW.options[index - 1].text;
  665.   LIST_COL_SHOW.options[index - 1].text = columnValue;
  666.   
  667.   //Now updated the List Arrays..
  668.   columnValue = m_ColShowArray[index];
  669.   m_ColShowArray[index] = m_ColShowArray[index - 1];
  670.   m_ColShowArray[index - 1] = columnValue;
  671.  
  672.   //Set the new selection
  673.   LIST_COL_SHOW.options[index].selected = false;
  674.   LIST_COL_SHOW.options[index-1].selected = true;
  675.   }
  676. }
  677.  
  678. //The "Move Down" button has been clicked
  679. function onMoveDownClicked()
  680. {
  681.   var index = LIST_COL_SHOW.selectedIndex;
  682.   
  683.   if( (index >= 0) & (index < (LIST_COL_SHOW.options.length - 1)))
  684.   {
  685.     //Swap the text in the list control
  686.   var columnValue = LIST_COL_SHOW.options[index].text;
  687.   LIST_COL_SHOW.options[index].text = LIST_COL_SHOW.options[index + 1].text;
  688.   LIST_COL_SHOW.options[index + 1].text = columnValue;
  689.   
  690.   //Now updated the List Arrays..
  691.   columnValue = m_ColShowArray[index];
  692.   m_ColShowArray[index] = m_ColShowArray[index + 1];
  693.   m_ColShowArray[index + 1] = columnValue;
  694.  
  695.   //Set the new selection.
  696.   LIST_COL_SHOW.options[index].selected = false;
  697.   LIST_COL_SHOW.options[index+1].selected = true;
  698.   }
  699. }
  700.  
  701. //The "Detail Move Up" button has been clicked
  702. function onDetailMoveUpClicked()
  703. {
  704.   var index = LIST_DETAIL_COL.selectedIndex
  705.   if(index > 0)
  706.   {
  707.     //Swap the text in the list control
  708.   var columnValue = LIST_DETAIL_COL.options[index].text;
  709.   LIST_DETAIL_COL.options[index].text = LIST_DETAIL_COL.options[index - 1].text;
  710.   LIST_DETAIL_COL.options[index - 1].text = columnValue;
  711.   
  712.   //Now updated the List Arrays..
  713.   columnValue = m_DetailColShowArray[index];
  714.   m_DetailColShowArray[index] = m_DetailColShowArray[index - 1];
  715.   m_DetailColShowArray[index - 1] = columnValue;
  716.  
  717.   //Set the new selection
  718.   LIST_DETAIL_COL.options[index].selected = false;
  719.   LIST_DETAIL_COL.options[index-1].selected = true;
  720.   }
  721. }
  722.  
  723. //The "Detail Move Down" button has been clicked
  724. function onDetailMoveDownClicked()
  725. {
  726.   var index = LIST_DETAIL_COL.selectedIndex;
  727.   
  728.   if( (index >= 0) & (index < (LIST_DETAIL_COL.options.length - 1)))
  729.   {
  730.     //Swap the text in the list control
  731.   var columnValue = LIST_DETAIL_COL.options[index].text;
  732.   LIST_DETAIL_COL.options[index].text = LIST_DETAIL_COL.options[index + 1].text;
  733.   LIST_DETAIL_COL.options[index + 1].text = columnValue;
  734.   
  735.   //Now updated the List Arrays..
  736.   columnValue = m_DetailColShowArray[index];
  737.   m_DetailColShowArray[index] = m_DetailColShowArray[index + 1];
  738.   m_DetailColShowArray[index + 1] = columnValue;
  739.  
  740.   //Set the new selection.
  741.   LIST_DETAIL_COL.options[index].selected = false;
  742.   LIST_DETAIL_COL.options[index+1].selected = true;
  743.   }
  744. }
  745.  
  746.  
  747. //The "<" button has been clicked. Add a column to the Columns to Show list
  748. function onAddButtonClicked()
  749. {
  750.   // check to see if there are columns to add first
  751.   if (m_ColAvlArray.length == 0){
  752.     alert(MM.MSG_NoMoreColumnsToAdd);
  753.     return;
  754.   }
  755.  
  756.   var colsToAdd = callCommand('Add Column.htm', m_ColAvlArray);
  757.   if (!colsToAdd) return; // user clicked Cancel
  758.  
  759.   var nCols = colsToAdd.length,i;
  760.   var currSelection = LIST_COL_SHOW.selectedIndex;
  761.   if(currSelection == -1){
  762.   currSelection = LIST_COL_SHOW.options.length;
  763.   }
  764.  
  765.   for(i = 0; i < colsToAdd.length; i++)
  766.   {
  767.     m_ColShowArray.splice(currSelection, 0, colsToAdd[i]);
  768.     currSelection++;
  769.   for (var j=0; j < m_ColAvlArray.length; j++)
  770.   {
  771.        if(m_ColAvlArray[j] == colsToAdd[i])
  772.        m_ColAvlArray.splice(j, 1);
  773.   }
  774.   }
  775.   updateColumnLists();
  776.   updateColumnLinkList();
  777. }
  778.  
  779. //The ">" button has been clicked. Remove a column to the Columns to Show list
  780. function onRemoveButtonClicked()
  781. {
  782.   if(LIST_COL_SHOW.selectedIndex >= 0)
  783.   {
  784.     var deleteCount = 0;
  785.     for (var start_select_index = LIST_COL_SHOW.selectedIndex;
  786.      start_select_index < LIST_COL_SHOW.options.length; start_select_index++)
  787.   {
  788.     if(LIST_COL_SHOW.options[start_select_index].selected == true)
  789.       {
  790.       m_ColAvlArray.splice(m_ColAvlArray.length, 0, m_ColShowArray[start_select_index - deleteCount]);
  791.       m_ColShowArray.splice((start_select_index - deleteCount), 1);
  792.       deleteCount++;
  793.     }
  794.   }
  795.   updateColumnLists();
  796.   updateColumnLinkList();
  797.   }
  798. }
  799.  
  800. function onDetailAddButtonClicked()
  801. {
  802.   // check to see if there are columns to add first
  803.   if (m_DetailColAvlArray.length == 0){
  804.     alert(MM.MSG_NoMoreColumnsToAdd);
  805.     return;
  806.   }
  807.  
  808.   var colsToAdd = callCommand('Add Column.htm', m_DetailColAvlArray);
  809.   if (!colsToAdd) return; // user clicked Cancel
  810.  
  811.   var nCols = colsToAdd.length,i;
  812.   var currSelection = LIST_DETAIL_COL.selectedIndex;
  813.   if(currSelection == -1){
  814.   currSelection = LIST_DETAIL_COL.options.length;
  815.   }
  816.  
  817.   for(i = 0; i < colsToAdd.length; i++)
  818.   {
  819.     m_DetailColShowArray.splice(currSelection, 0, colsToAdd[i]);
  820.     currSelection++;
  821.   for (var j=0; j < m_DetailColAvlArray.length; j++)
  822.   {
  823.        if(m_DetailColAvlArray[j] == colsToAdd[i])
  824.        m_DetailColAvlArray.splice(j, 1);
  825.   }
  826.   }
  827.   updateDetailColumnList();
  828. }
  829.  
  830. //The ">" button has been clicked. Remove a column to the Columns to Show list
  831. function onDetailRemoveButtonClicked()
  832. {
  833.   if(LIST_DETAIL_COL.selectedIndex >= 0)
  834.   {
  835.     var deleteCount = 0;
  836.     for (var start_select_index = LIST_DETAIL_COL.selectedIndex;
  837.      start_select_index < LIST_DETAIL_COL.options.length; start_select_index++)
  838.   {
  839.     if(LIST_DETAIL_COL.options[start_select_index].selected == true)
  840.       {
  841.       m_DetailColAvlArray.splice(m_DetailColAvlArray.length, 0, m_DetailColShowArray[start_select_index - deleteCount]);
  842.       m_DetailColShowArray.splice((start_select_index - deleteCount), 1);
  843.       deleteCount++;
  844.     }
  845.   }
  846.   updateDetailColumnList();
  847.   }
  848. }
  849.  
  850.  
  851. function setCount(element)
  852. {
  853.    if (element.value == "All"){
  854.        NUM_RepeatCount = TF_REPEAT_COUNT.value;
  855.        TF_REPEAT_COUNT.value = "";
  856.    } else {
  857.        TF_REPEAT_COUNT.value = NUM_RepeatCount;
  858.    }
  859. }
  860.  
  861. function browseButtonClicked()
  862. {
  863.   var result = dw.browseForFileURL("select", MM.MSG_detailPageDialog, false, true);
  864.   
  865.   if (result) {
  866.      EDIT_FILENAME.value = result;
  867.   }
  868. }
  869.  
  870. //Function: buildUpFileName
  871. //Purpose: Accept the file name as a param. Do the following:
  872. //  1. Add extension to name if it does not already exist.
  873. //  2. Prepend the current document path to the file name.
  874. //  This function assumes that the current document has been saved, since this
  875. //  would have been checked when the object was called.
  876. //
  877. function buildUpFileName(baseName)
  878. {
  879.   //Initialize vars
  880.   var retVal = "";
  881.   var lastIndex = -1;
  882.   var path = "";
  883.   var newPath = "";
  884.  
  885.   var ext = dw.getDocumentDOM().serverModel.getServerExtension();
  886.  
  887.   //Attach the file extension to the baseName if it doesn't already exist.
  888.   if(baseName.lastIndexOf(ext) == -1){
  889.   baseName = baseName + ext;
  890.   }
  891.  
  892.   //Set the m_FileName global var with the corrected (if necessary) file name.
  893.   m_FileName = baseName;
  894.  
  895.   path = dreamweaver.getDocumentPath("document");
  896.   
  897.   lastIndex = path.lastIndexOf("/");
  898.   newPath = path.slice(0, lastIndex + 1);
  899.   retVal = newPath + baseName;
  900.  
  901.   return retVal;
  902. }
  903.  
  904. function createNewRepeatRegionName()
  905. {
  906.   //search the ssRecs for other names
  907.   var retVal = "";
  908.   
  909.   var ssRecs = dw.serverBehaviorInspector.getServerBehaviors();
  910.   
  911.   var num = 0;
  912.   var rrName = "";
  913.   
  914.   while (!retVal) {
  915.     num++;
  916.     rrName = "Repeat" + num;
  917.     for (var i=0; i < ssRecs.length; i++) { //search all ssRecs
  918.       var ssRec = ssRecs[i];
  919.       if (ssRec.parameters.loopName != null && 
  920.           ssRec.parameters.loopName.toLowerCase() == rrName.toLowerCase()) {
  921.         break;
  922.       }
  923.     }
  924.     if (i >= ssRecs.length) {
  925.       retVal = rrName;
  926.     }
  927.   }
  928.   
  929.   return retVal;
  930. }
  931.  
  932.